#pragma once

#define NAME_MAX 20
#define GENDER_MAX 5
#define TEL_MAX 20
#define ADDR_MAX 100
//定义联系人数据结构体
//姓名 性别 年龄 电话 地址
struct personInfo
{
    char name[NAME_MAX];    //自发数组
    char gender[GENDER_MAX];
    int age;
    char tel[TEL_MAX];
    char address[ADDR_MAX];
};

//如果使用上述实例化结构体对象，每次都要写struct personInfo，比较麻烦
typedef struct personInfo PeoInfo; //给struct personInfo起别名PeoInfo，这样实例化结构体的时候可以直接用PeoInfo

typedef struct personInfo
{
    char name[NAME_MAX];    //自发数组
    char gender[GENDER_MAX];
    int age;
    char tel[TEL_MAX];
    char address[ADDR_MAX];
}PeoInfo;

struct SeqList; //前置声明

//要用到顺序表相关的方法，通讯录本质就是元素为自定义成员变量的结构体
//把顺序表改个名字，叫通讯录
//typedef SL Contact;

typedef struct SeqList Contact;  //重命名
//通讯录相关方法声明

//通讯录的初始化
void ContactInit(Contact* con);
//通讯录的销毁
void ContactDestroy(Contact* con);
//通讯录添加数据
void ContactAdd(Contact* con);
//通讯录删除数据
void ContactDel(Contact* con);
//通讯录修改数据
void ContactModify(Contact* con);
//通讯录查找数据
void ContactSearch(Contact* con);
//通讯录打印所有数据
void ContactPrint(Contact con);
//修改联系人信息
void ContatactModify(Contact* con);
//==============================================
/*
    //SeqList List.c
    typedef struct SeqList  //定义顺序表结构体类型
    {
        SLDataType* arr;    //存储空间，动态申请的数组
        int size;          //当前长度(有效数据个数)
        int capacity;      //容量(最大存储空间)，当前申请的空间大小
    }SL;


    //Contact.h

    typedef SL Contact;    //Contact.h里不认识SL


    //Contact.h
    struct SeqList;    //所以需要前置声明  struct SeqList
    typedef SL Contact;    //Contact.h里不认识SL

    这样其实也不行，需要如下：

    //Contact.h 正确版
    struct SeqList;    //所以需要前置声明  struct SeqList
    typedef struct SeqList Contact;    //Contact.h里不认识SL

    //注释：Contact.h只是声明struct SeqList，没有实际使用。（实际在Contact.c里使用）
    -------------------------------------------------------------------
    原因：
    //SeqList List.c
    typedef struct SeqList  //定义顺序表结构体类型
    {
        SLDataType* arr;    //存储空间，动态申请的数组
        int size;          //当前长度(有效数据个数)
        int capacity;      //容量(最大存储空间)，当前申请的空间大小
    }SL;

    等价于typedef struct SeqList SL;
    即SL是在struct SeqList定义之后才定义的，不是同步定义。

*/